home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc™ Source Code / Storage / Bento / MemCtr.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-28  |  8.5 KB  |  323 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        MemCtr.cpp
  3.  
  4.     Contains:    Implementation of ODMemContainer class.
  5.  
  6.     Owned by:    Paul Hartenstine
  7.  
  8.     Copyright:    © 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <5>     8/13/96    DM        1376080: TempSuppressFatalBentoError
  13.                                     spelling
  14.          <4>     5/24/96    jpa        1246074: SOM_CATCH --> SOM_TRY..SOM_ENDTRY
  15.          <3>     5/23/96    DH        1344338: Force quit of document when
  16.                                     dragging 'Bad' file or Container. Turned
  17.                                     off fatal Bento errors for Open and Create
  18.                                     container operations.
  19.  
  20.     To Do:
  21.     In Progress:
  22.         
  23. */
  24.  
  25. #define ODMemContainer_Class_Source
  26.  
  27. #define VARIABLE_MACROS
  28.  
  29. #include <MemCtr.xih>
  30.  
  31. #ifndef _PLFMDEF_
  32. #include "PlfmDef.h"
  33. #endif
  34.  
  35. #ifndef SOM_ODStorageSystem_xh
  36. #include <ODStor.xh>
  37. #endif
  38.  
  39. #ifndef _MEMHDR_
  40. #include "MemHdr.h"
  41. #endif
  42.  
  43. #ifndef _TARGTHDR_
  44. #include "TargtHdr.h"
  45. #endif
  46.  
  47. #ifndef __CM_API__
  48. #include "CMAPI.h"
  49. #endif
  50.  
  51. #ifndef _EXCEPT_
  52. #include "Except.h"
  53. #endif
  54.  
  55. #ifndef _ODNEW_
  56. #include <ODNew.h>
  57. #endif
  58.  
  59. #ifndef _BENTODEF_
  60. #include "BentoDef.h"
  61. #endif
  62.  
  63. #ifndef _SESSHDR_
  64. #include "SessHdr.h"
  65. #endif
  66.  
  67. #ifndef _BENTOSUPPRESS_
  68. #include <BentoSuppress.h>
  69. #endif
  70.  
  71. #pragma segment ODMemContainer
  72.  
  73. //==============================================================================
  74. // ODMemContainer
  75. //==============================================================================
  76.  
  77. //------------------------------------------------------------------------------
  78. // ODMemContainer: ~ODMemContainer
  79. //------------------------------------------------------------------------------
  80.  
  81. SOM_Scope void  SOMLINK ODMemContainersomUninit(ODMemContainer *somSelf)
  82. {
  83.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  84.     ODMemContainerMethodDebug("ODMemContainer","somUninit");
  85.  
  86. #ifdef DebugRefCount
  87.     printf("~ODMemContainer %x CMContainer %x RefCount %d\n", somSelf, _fCMContainer, _fRefCount);
  88.     fflush(stdout);
  89. #endif
  90.  
  91.     TRY{
  92.         Environment *ev = somGetGlobalEnvironment ();
  93.     
  94.         if (_fCMContainer != kODNULL)
  95.             somSelf->Close(ev);
  96.     
  97.         if (_fHandlers != kODNULL)
  98.             delete _fHandlers;
  99.     
  100.         if (_fName != kODNULL)
  101.             DisposeIText(_fName);
  102.     }CATCH_ALL{
  103.         // Ignore any errors
  104.     }ENDTRY
  105. }
  106.  
  107. //------------------------------------------------------------------------------
  108. // ODMemContainer: InitContainer
  109. //------------------------------------------------------------------------------
  110.  
  111. SOM_Scope void  SOMLINK ODMemContainerInitContainer(ODMemContainer *somSelf, Environment *ev,
  112.         ODStorageSystem* storage, ODContainerID* id)
  113. {
  114.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  115.     ODMemContainerMethodDebug("ODMemContainer","InitContainer");
  116.     
  117.     SOM_TRY
  118.  
  119.     /* Moved from somInit. SOM itself sets fields to zero
  120.     _fCMContainer = kODNULL;
  121.     _fHandlers = kODNULL;
  122.     _fName = kODNULL;
  123.     */
  124.     
  125.     ODMemContainer_parent_ODBentoContainer_InitContainer(somSelf, ev, storage, id);
  126.     
  127.     _fHandlers = new(somSelf->GetHeap(ev)) ODMemBentoHandlers(somSelf->GetCMSession(ev),
  128.                                                              *((ODHandle*) id->_buffer));
  129.     _fHandlers->Initialize();
  130.     
  131.     _fName = CreateIText(0);
  132.  
  133.     SOM_CATCH_ALL
  134.     SOM_ENDTRY
  135. }
  136.  
  137. //------------------------------------------------------------------------------
  138. // ODMemContainer: GetName
  139. //------------------------------------------------------------------------------
  140.  
  141. SOM_Scope ODContainerName  SOMLINK ODMemContainerGetName(ODMemContainer *somSelf, Environment *ev)
  142. {
  143.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  144.     ODMemContainerMethodDebug("ODMemContainer","GetName");
  145.     
  146.     return *_fName;
  147. }
  148.  
  149. //------------------------------------------------------------------------------
  150. // ODMemContainer: SetName
  151. //------------------------------------------------------------------------------
  152.  
  153. SOM_Scope void  SOMLINK ODMemContainerSetName(ODMemContainer *somSelf, Environment *ev,
  154.         ODContainerName* name)
  155. {
  156.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  157.     ODMemContainerMethodDebug("ODMemContainer","SetName");
  158.  
  159.     SOM_TRY
  160.     
  161.     if (_fName != kODNULL) {
  162.         DisposeIText(_fName);
  163.     }
  164.     _fName = CopyIText(name);
  165.  
  166.     SOM_CATCH_ALL
  167.     SOM_ENDTRY
  168. }
  169.  
  170. //------------------------------------------------------------------------------
  171. // ODMemContainer: Create
  172. //------------------------------------------------------------------------------
  173.  
  174. SOM_Scope ODContainer*  SOMLINK ODMemContainerCreate(ODMemContainer *somSelf, Environment *ev)
  175. {
  176.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  177.     ODMemContainerMethodDebug("ODMemContainer","Create");
  178.  
  179.     SOM_TRY
  180.     
  181.     if (_fCMContainer == kODNULL) {
  182.     
  183.         CMSession cmSession = somSelf->GetCMSession(ev);
  184.  
  185.         CMSetMetaHandler(cmSession,
  186.                         (CMGlobalName)CMTargetHandlersTypeName,
  187.                         targetContainerMetahandler);
  188.                         
  189.         {    
  190.             TempSuppressFatalBentoError temp;
  191.                 
  192.             _fCMContainer = CMOpenNewContainer(cmSession,
  193.                                             _fHandlers,
  194.                                             (CMGlobalName) kODBentoMemoryTypeName,
  195.                                             (CMContainerUseMode)(kCMWriting),
  196.                                             1, 0);
  197.         }
  198.         if (_fCMContainer == kODNULL)
  199.             THROW(kODErrCannotCreateContainer);
  200.         ODSessionRestoreCMAllocReserve(_fCMContainer);
  201.  
  202.     }
  203.     return somSelf;
  204.  
  205.     SOM_CATCH_ALL
  206.     SOM_ENDTRY
  207.     return somSelf;
  208. }
  209.  
  210. //------------------------------------------------------------------------------
  211. // ODMemContainer: Open
  212. //------------------------------------------------------------------------------
  213.  
  214. SOM_Scope ODContainer*  SOMLINK ODMemContainerOpen(ODMemContainer *somSelf, Environment *ev)
  215. {
  216.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  217.     ODMemContainerMethodDebug("ODMemContainer","Open");
  218.  
  219.     SOM_TRY
  220.  
  221.     if (_fCMContainer == kODNULL) {
  222.     
  223.         CMSession cmSession = somSelf->GetCMSession(ev);
  224.  
  225.         CMSetMetaHandler(cmSession,
  226.                         (CMGlobalName)CMTargetHandlersTypeName,
  227.                         targetContainerMetahandler);
  228.                         
  229.         {    
  230.             TempSuppressFatalBentoError temp;
  231.                 
  232.             _fCMContainer = CMOpenNewContainer(cmSession,
  233.                                             _fHandlers,
  234.                                             (CMGlobalName) kODBentoMemoryTypeName,
  235.                                             (CMContainerUseMode)(kCMUpdateByAppend),
  236.                                             1, 0);
  237.         }
  238.         if (_fCMContainer == kODNULL)
  239.             THROW(kODErrCannotOpenContainer);
  240.  
  241.         ODSessionRestoreCMAllocReserve(_fCMContainer);
  242.     }
  243.     return somSelf;
  244.  
  245.     SOM_CATCH_ALL
  246.     SOM_ENDTRY
  247.     return somSelf;
  248. }
  249.  
  250. //------------------------------------------------------------------------------
  251. // ODMemContainer: Close
  252. //------------------------------------------------------------------------------
  253.  
  254. SOM_Scope ODContainer*  SOMLINK ODMemContainerClose(ODMemContainer *somSelf, Environment *ev)
  255. {
  256.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  257.     ODMemContainerMethodDebug("ODMemContainer","Close");
  258.  
  259.     if (_fCMContainer != kODNULL) {
  260.         SOM_TRY
  261.             ODSessionMustHaveCMAllocReserve(_fCMContainer);
  262.             if (somSelf->GetDirtyFlag(ev) != kODFalse)
  263.                 CMCloseContainer(_fCMContainer);
  264.             else
  265.                 CMAbortContainer(_fCMContainer);
  266.         SOM_CATCH_ALL
  267.             if (ErrorCode() == kODErrBentoErr)
  268.                 SetErrorCode(kODErrFatalContainerError);
  269.         SOM_ENDTRY
  270.         _fCMContainer = kODNULL;
  271.     }
  272.     
  273.     return ODMemContainer_parent_ODBentoContainer_Close(somSelf, ev);
  274. }
  275.  
  276. //------------------------------------------------------------------------------
  277. // ODMemContainer: Purge
  278. //------------------------------------------------------------------------------
  279.  
  280. SOM_Scope ODSize  SOMLINK ODMemContainerPurge(ODMemContainer *somSelf, Environment *ev,
  281.         ODSize size)
  282. {
  283.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  284.     ODMemContainerMethodDebug("ODMemContainer","Purge");
  285.  
  286.     ODSize freed = 0; ODVolatile(freed);
  287.  
  288.     SOM_TRY
  289.         freed = parent_Purge(somSelf, ev, size);
  290.     SOM_CATCH_ALL
  291.         WARN("Error %ld trying to purge in ODMemContainerPurge",ErrorCode());
  292.         SetErrorCode(kODNoError);        // Eat the exception; Purge should not 
  293.                                         // propagate it because clients function
  294.                                         // fine whether memory was purged or not.
  295.     SOM_ENDTRY
  296.  
  297.     return freed;
  298. }
  299.  
  300. //------------------------------------------------------------------------------
  301. // ODMemContainer: GetCMContainer
  302. //------------------------------------------------------------------------------
  303.  
  304. SOM_Scope CMContainer  SOMLINK ODMemContainerGetCMContainer(ODMemContainer *somSelf, Environment *ev)
  305. {
  306.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  307.     ODMemContainerMethodDebug("ODMemContainer","GetCMContainer");
  308.  
  309.     return _fCMContainer;
  310. }
  311.  
  312. //------------------------------------------------------------------------------
  313. // ODMemContainer: GetHandlers
  314. //------------------------------------------------------------------------------
  315.  
  316. SOM_Scope ODBentoHandlers*  SOMLINK ODMemContainerGetHandlers(ODMemContainer *somSelf, Environment *ev)
  317. {
  318.     ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
  319.     ODMemContainerMethodDebug("ODMemContainer","GetHandlers");
  320.  
  321.     return _fHandlers;
  322. }
  323.